#!/bin/bash

# =============================================
# Git 一键安装与配置脚本
# 适用于主流 Linux 发行版
# =============================================

# 在任何命令失败时立即退出
set -e

# 定义 Git 配置变量（请在安装前根据实际情况修改）
GIT_USER_NAME="" # Git 用户名
GIT_USER_EMAIL="" # Git 邮箱
GIT_EDITOR="vim" # 默认编辑器 (vim, nano, code等)
GIT_DEFAULT_BRANCH="main"  # 默认分支名称

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检测系统类型
detect_os() {
    if [ -f /etc/os-release ]; then
        # 使用 source 命令加载文件，然后可以直接使用里面的变量
        source /etc/os-release
        OS="$PRETTY_NAME" # 用于显示的友好名称
        OS_ID="$ID"       # 用于 case 判断的 ID，如 ubuntu, fedora, arch
    else
        log_error "无法检测操作系统类型 (缺少 /etc/os-release)"
        exit 1
    fi
    
    log_info "检测到操作系统: $OS ($OS_ID)"
}

# 安装 Git
install_git() {
    log_info "开始安装 Git..."
    
    case $OS_ID in
        ubuntu|debian)
            log_info "使用 apt 包管理器安装 Git"
            sudo apt update || { log_error "apt update 失败，请检查网络或权限"; exit 1; }
            sudo apt install -y git || { log_error "apt install git 失败，请检查权限"; exit 1; }
            ;;
        centos|rhel|fedora|opencloudos)
            if command -v dnf >/dev/null 2>&1; then
                log_info "使用 dnf 包管理器安装 Git"
                sudo dnf install -y git || { log_error "dnf install git 失败，请检查权限"; exit 1; }
            elif command -v yum >/dev/null 2>&1; then
                log_info "使用 yum 包管理器安装 Git"
                sudo yum install -y git || { log_error "yum install git 失败，请检查权限"; exit 1; }
            else
                log_error "未找到合适的包管理器"
                exit 1
            fi
            ;;
        arch|manjaro)
            log_info "使用 pacman 包管理器安装 Git"
            sudo pacman -Sy --noconfirm git || { log_error "pacman install git 失败，请检查权限"; exit 1; }
            ;;
        opensuse*)
            log_info "使用 zypper 包管理器安装 Git"
            sudo zypper refresh || { log_error "zypper refresh 失败，请检查网络或权限"; exit 1; }
            sudo zypper install -y git || { log_error "zypper install git 失败，请检查权限"; exit 1; }
            ;;
        alpine)
            log_info "使用 apk 包管理器安装 Git"
            sudo apk update || { log_error "apk update 失败，请检查网络或权限"; exit 1; }
            sudo apk add git || { log_error "apk add git 失败，请检查权限"; exit 1; }
            ;;
        *)
            log_error "不支持的操作系统: $OS_ID"
            log_info "请手动安装 Git"
            exit 1
            ;;
    esac
    
    # 验证安装
    if command -v git >/dev/null 2>&1; then
        GIT_VERSION=$(git --version | awk '{print $3}')
        log_success "Git 安装成功! 版本: $GIT_VERSION"
    else
        log_error "Git 安装失败!"
        exit 1
    fi
}

# 配置 Git
configure_git() {
    log_info "开始配置 Git..."
    
    # 设置用户信息
    git config --global user.name "$GIT_USER_NAME"
    log_success "设置 user.name: $GIT_USER_NAME"
    
    git config --global user.email "$GIT_USER_EMAIL"
    log_success "设置 user.email: $GIT_USER_EMAIL"
    
    # 设置其他配置
    git config --global core.editor "$GIT_EDITOR"
    log_success "设置 core.editor: $GIT_EDITOR"
    
    git config --global init.defaultBranch "$GIT_DEFAULT_BRANCH"
    log_success "设置默认分支: $GIT_DEFAULT_BRANCH"
    
    # 设置常用配置
    git config --global color.ui auto
    git config --global push.default simple
    git config --global pull.rebase false
    git config --global core.autocrlf input
    
    log_success "Git 常用配置完成"
}

# 显示配置信息
show_config() {
    log_info "当前 Git 全局配置:"
    echo "================================"
    git config --global --list
    echo "================================"
}

# 显示安装后信息
show_post_install_info() {
    log_success "Git 安装和配置完成!"
    echo ""
    log_info "下一步建议:"
    echo "  1. 验证安装: git --version"
    echo "  2. 查看配置: git config --global --list"
    echo "  3. 如果需要修改配置，可以重新编辑此脚本或直接运行 git config 命令"
    echo ""
    log_info "常用 Git 命令:"
    echo "  git init          # 初始化新仓库"
    echo "  git clone <url>   # 克隆远程仓库"
    echo "  git status        # 查看状态"
    echo "  git add .         # 添加所有文件到暂存区"
    echo "  git commit -m 'message'  # 提交更改"
    echo "  git push          # 推送到远程仓库"
}

# 主函数
main() {
    log_info "=== Git 一键安装与配置脚本 ==="
    log_info "开始时间: $(date)"

    # 检查用户是否已修改配置
    if [ "$GIT_USER_NAME" = "Your Name" ] || [ "$GIT_USER_EMAIL" = "your.email@example.com" ]; then
        log_error "请先在脚本中修改 GIT_USER_NAME 和 GIT_USER_EMAIL 变量！"
        log_info "编辑此脚本 (例如: nano $0) 并填写你的信息后重新运行。"
        exit 1
    fi
    
    # 检测是否已安装 Git
    if command -v git >/dev/null 2>&1; then
        CURRENT_VERSION=$(git --version | awk '{print $3}')
        log_info "Git 已安装，当前版本: $CURRENT_VERSION"
        read -p "是否继续配置 Git? (y/n): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            log_info "用户取消操作"
            exit 0
        fi
    else
        detect_os
        install_git
    fi
    
    configure_git
    show_config
    show_post_install_info
    
    log_success "脚本执行完成!"
}

# 脚本执行入口
if [ "$(id -u)" -eq 0 ]; then
    log_warning "不建议以 root 用户运行此脚本，这可能会影响用户级别的 Git 配置"
    read -p "是否继续? (y/n): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
fi

main
